home *** CD-ROM | disk | FTP | other *** search
/ QRZ! Ham Radio 8 / QRZ Ham Radio Callsign Database - Volume 8.iso / mac / files / t_sys5 / unixcpio.gz / unixnet.cpio / ipcmd.c < prev    next >
C/C++ Source or Header  |  1994-07-11  |  5KB  |  243 lines

  1. /* IP-related user commands */
  2. #include <stdio.h>
  3. #include "global.h"
  4. #include "mbuf.h"
  5. #include "internet.h"
  6. #include "timer.h"
  7. #include "netuser.h"
  8. #include "iface.h"
  9. #include "ip.h"
  10. #include "cmdparse.h"
  11.  
  12. int doipaddr(),doipstat(),dottl();
  13. extern char badhost[];
  14. struct cmds ipcmds[] = {
  15.     "address",    doipaddr,    0,    NULLCHAR,    NULLCHAR,
  16.     "status",    doipstat,    0,    NULLCHAR,    NULLCHAR,
  17.     "ttl",        dottl,        0,    NULLCHAR,    NULLCHAR,
  18.     NULLCHAR,    NULLFP,        0,
  19.         "ip subcommands: address status ttl",    NULLCHAR,
  20. };
  21. doip(argc,argv)
  22. int argc;
  23. char *argv[];
  24. {
  25.     return subcmd(ipcmds,argc,argv);
  26. }
  27. int
  28. doipaddr(argc,argv)
  29. int argc;
  30. char *argv[];
  31. {
  32.     char *inet_ntoa();
  33.     int32 n;
  34.  
  35.     if(argc < 2) {
  36.         printf("%s\n",inet_ntoa(ip_addr));
  37.     } else if((n = resolve(argv[1])) == 0){
  38.         printf(badhost,argv[1]);
  39.         return 1;
  40.     } else
  41.         ip_addr = n;
  42.     return 0;
  43. }
  44. int
  45. dottl(argc,argv)
  46. char *argv[];
  47. {
  48.     if(argc < 2)
  49.         printf("%u\n",uchar(ip_ttl));
  50.     else
  51.         ip_ttl = atoi(argv[1]);
  52.     return 0;
  53. }
  54.  
  55. /* "route" subcommands */
  56. int doadd(),dodrop();
  57. static struct cmds rtcmds[] = {
  58.     "add", doadd, 3,
  59.     "route add <dest addr>[/<bits>] <if name> [gateway] [metric]",
  60.     "Add failed",
  61.  
  62.     "drop", dodrop, 2,
  63.     "route drop <dest addr>[/<bits>]",
  64.     "Not in table",
  65.  
  66.     NULLCHAR, NULLFP, 0,
  67.     "route subcommands: add, drop",
  68.     NULLCHAR, 
  69. };
  70.  
  71. /* Display and/or manipulate routing table */
  72. int
  73. doroute(argc,argv)
  74. int argc;
  75. char *argv[];
  76. {
  77.     if(argc < 2){
  78.         dumproute();
  79.         return 0;
  80.     }
  81.     return subcmd(rtcmds,argc,argv);
  82. }
  83. /* Add an entry to the routing table
  84.  * E.g., "add 1.2.3.4 ax0 5.6.7.8 3"
  85.  */
  86. int
  87. doadd(argc,argv)
  88. int argc;
  89. char *argv[];
  90. {
  91.     struct interface *ifp;
  92.     int32 dest,gateway;
  93.     unsigned bits;
  94.     char *bitp;
  95.     int metric;
  96.  
  97.     if(strcmp(argv[1],"default") == 0){
  98.         dest = 0;
  99.         bits = 0;
  100.     } else {
  101.         if((dest = resolve(argv[1])) == 0){
  102.             printf(badhost,argv[1]);
  103.             return 1;
  104.         }
  105.  
  106.         /* If IP address is followed by an optional slash and
  107.          * a length field, (e.g., 128.96/16) get it;
  108.          * otherwise assume a full 32-bit address
  109.          */
  110.         if((bitp = index(argv[1],'/')) != NULLCHAR){
  111.             bitp++;
  112.             bits = atoi(bitp);
  113.         } else
  114.             bits = 32;
  115.     }
  116.     for(ifp=ifaces;ifp != NULLIF;ifp = ifp->next){
  117.         if(strcmp(argv[2],ifp->name) == 0)
  118.             break;
  119.     }
  120.     if(ifp == NULLIF){
  121.         printf("Interface \"%s\" unknown\n",argv[2]);
  122.         return 1;
  123.     }
  124.     if(argc > 3){
  125.         if((gateway = resolve(argv[3])) == 0){
  126.             printf(badhost,argv[3]);
  127.             return 1;
  128.         }
  129.     } else {
  130.         gateway = 0;
  131.     }
  132.     if(argc > 4)
  133.         metric = atoi(argv[4]);
  134.     else
  135.         metric = 0;
  136.  
  137.     rt_add(dest,bits,gateway,metric,ifp);
  138.     return 0;
  139. }
  140. /* Drop an entry from the routing table
  141.  * E.g., "drop 128.96/16
  142.  */
  143. /*ARGSUSED*/
  144. int
  145. dodrop(argc,argv)
  146. int argc;
  147. char *argv[];
  148. {
  149.     char *bitp;
  150.     unsigned bits;
  151.     int32 n;
  152.  
  153.     if(strcmp(argv[1],"default") == 0){
  154.         n = 0;
  155.         bits = 0;
  156.     } else {
  157.         /* If IP address is followed by an optional slash and length field,
  158.          * (e.g., 128.96/16) get it; otherwise assume a full 32-bit address
  159.          */
  160.         if((bitp = index(argv[1],'/')) != NULLCHAR){
  161.             bitp++;
  162.             bits = atoi(bitp);
  163.         } else
  164.             bits = 32;
  165.  
  166.         if((n = resolve(argv[1])) == 0){
  167.             printf(badhost,argv[1]);
  168.             return 1;
  169.         }
  170.     }
  171.     return rt_drop(n,bits);
  172. }
  173.  
  174. /* Dump IP routing table
  175.  * Dest              Length    Interface    Gateway          Metric
  176.  * 192.001.002.003   32        sl0          192.002.003.004       4
  177.  */
  178. int
  179. dumproute()
  180. {
  181.     register unsigned int i,bits;
  182.     register struct route *rp;
  183.  
  184.     printf("Dest              Length    Interface    Gateway          Metric\n");
  185.     if(r_default.interface != NULLIF){
  186.         printf("default           0         %-13s",
  187.          r_default.interface->name);
  188.         if(r_default.gateway != 0)
  189.             printf("%-17s",inet_ntoa(r_default.gateway));
  190.         else
  191.             printf("%-17s","");
  192.         printf("%6u\n",r_default.metric);
  193.     }
  194.     for(bits=1;bits<=32;bits++){
  195.         for(i=0;i<NROUTE;i++){
  196.             for(rp = routes[bits-1][i];rp != NULLROUTE;rp = rp->next){
  197.                 printf("%-18s",inet_ntoa(rp->target));
  198.                 printf("%-10u",bits);
  199.                 printf("%-13s",rp->interface->name);
  200.                 if(rp->gateway != 0)
  201.                     printf("%-17s",inet_ntoa(rp->gateway));
  202.                 else
  203.                     printf("%-17s","");
  204.                 printf("%6u\n",rp->metric);
  205.             }
  206.         }
  207.     }
  208.     return 0;
  209. }
  210.  
  211. /*ARGSUSED*/
  212. int
  213. doipstat(argc,argv)
  214. int argc;
  215. char *argv[];
  216. {
  217.     extern struct ip_stats ip_stats;
  218.     extern struct reasm *reasmq;
  219.     register struct reasm *rp;
  220.     register struct frag *fp;
  221.     char *inet_ntoa();
  222.  
  223.     printf("IP: total %ld runt %u len err %u vers err %u",
  224.         ip_stats.total,ip_stats.runt,ip_stats.length,ip_stats.version);
  225.     printf(" chksum err %u badproto %u\n",
  226.         ip_stats.checksum,ip_stats.badproto);
  227.  
  228.     if(reasmq != NULLREASM)
  229.         printf("Reassembly fragments:\n");
  230.     for(rp = reasmq;rp != NULLREASM;rp = rp->next){
  231.         printf("src %s",inet_ntoa(rp->source));
  232.         printf(" dest %s",inet_ntoa(rp->dest));
  233.         printf(" id %u pctl %u time %lu len %u\n",
  234.             rp->id,uchar(rp->protocol),rp->timer.count,rp->length);
  235.         for(fp = rp->fraglist;fp != NULLFRAG;fp = fp->next){
  236.             printf(" offset %u last %u\n",fp->offset,fp->last);
  237.         }
  238.     }
  239.     doicmpstat();
  240.     return 0;
  241. }
  242.  
  243.